package org.jiuling.netty.config;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;

/**
 * Netty服务配置
 * @author 紫灵
 * @date 2025年07月05日 10时36分30秒
 */
public class NettyServerConfig {

    /** 端口 */
    private int port;
    /** 主机地址,默认为 0.0.0.0 */
    private String hostName = "0.0.0.0";
//    /** 连接处理器 */
//    private List<ChannelHandler> channelHandlerList;
    /** 主线程组数 */
    private int bossThreadNumber = 1;
    /** 工作线程组数 */
    private int workThreadNumber = 1;

    /** 连接初始化 */
    private ChannelInitializer<? extends Channel> channelInitializer;

    public int getPort() {
        return port;
    }

    public String getHostName() {
        return hostName;
    }

    public ChannelInitializer<? extends Channel> getChannelInitializer() {
        return channelInitializer;
    }

    public int getBossThreadNumber() {
        return bossThreadNumber;
    }

    public int getWorkThreadNumber() {
        return workThreadNumber;
    }


    /**
     * 建造者
     * @return 建造者
     */
    public static Builder builder(){
        return new Builder();
    }

    /**
     * 建造者
     */
    public static class Builder {

        /** Netty服务配置 */
        private final NettyServerConfig nettyServerConfig;

        public Builder() {
            this.nettyServerConfig = new NettyServerConfig();
        }

        /**
         * 添加端口
         * @param port 端口
         * @return 当前对象
         */
        public Builder addPort(int port){
            nettyServerConfig.port = port;
            return this;
        }

        /**
         * 添加主线程组数
         * @param bossThreadNumber 主线程组数
         * @return 当前对象
         */
        public Builder addBossThreadNumber(int bossThreadNumber){
            nettyServerConfig.bossThreadNumber = bossThreadNumber;
            return this;
        }

        /**
         * 添加工作线程组数
         * @param workerThreadNumber 工作线程组数
         * @return 当前对象
         */
        public Builder addWorkThreadNumber(int workerThreadNumber){
            nettyServerConfig.workThreadNumber = workerThreadNumber;
            return this;
        }

        /**
         * 添加主机地址
         * @param hostName 主机地址
         * @return 当前对象
         */
        public Builder addHostName(String hostName){
            nettyServerConfig.hostName = hostName;
            return this;
        }

        /**
         * 添加连接初始化
         * @param channelInitializer 连接初始化
         * @return 当前对象
         */
        public Builder addchannelInitializer(ChannelInitializer<? extends Channel> channelInitializer){
            nettyServerConfig.channelInitializer = channelInitializer;
            return this;
        }


//        /**
//         * 添加解码器
//         * @param decoder 解码器
//         * @return 当前对象
//         */
//        public Builder addDecoder(ChannelInboundHandler decoder){
//            List<ChannelHandler> channelHandlerList = this.getChannelHandlerList();
//            channelHandlerList.add(decoder);
//            return this;
//        }

//        /**
//         * 添加处理器
//         * @param handler 处理器
//         * @return 当前对象
//         */
//        public Builder addHandler(SimpleChannelInboundHandler<?> handler){
//            List<ChannelHandler> channelHandlerList = this.getChannelHandlerList();
//            channelHandlerList.add(handler);
//            return this;
//        }

//        /**
//         * 添加编码器
//         * @param encoder 编码器
//         * @return 当前对象
//         */
//        public Builder addEncoder(ChannelInboundHandler encoder){
//            List<ChannelHandler> channelHandlerList = this.getChannelHandlerList();
//            channelHandlerList.add(encoder);
//            return this;
//        }

//        /**
//         * 添加WebSocketUrl地址
//         * @param webSocketUrl WebSocketUrl地址
//         * @return 当前对象
//         */
//        public Builder addWebSocketUrl(String webSocketUrl){
//            nettyServerConfig.webSocketUrl = webSocketUrl;
//            return this;
//        }
//
//        /**
//         * 添加最大内容长度
//         * @param maxContentLength 最大内容长度
//         * @return 当前对象
//         */
//        public Builder addMaxContentLength(int maxContentLength){
//            nettyServerConfig.maxContentLength = maxContentLength;
//            return this;
//        }

        /**
         * 构建Netty服务配置
         * @return Netty服务配置
         */
        public NettyServerConfig build(){
//            if (!StringVerify.isBlank(nettyServerConfig.webSocketUrl)){
//                List<ChannelHandler> channelHandlerList = this.getChannelHandlerList();
//                // 顺序必须保持一直
//                channelHandlerList.add(new WebSocketServerProtocolHandler(nettyServerConfig.webSocketUrl));
//                channelHandlerList.add(new HttpObjectAggregator(nettyServerConfig.maxContentLength));
//                channelHandlerList.add(new HttpServerCodec());
//                // 进行倒叙处理
//                Collections.reverse(channelHandlerList);
//            }
            return nettyServerConfig;
        }

//        /**
//         * 获取连接处理器列表
//         * @return 连接处理器列表
//         */
//        private List<ChannelHandler> getChannelHandlerList(){
//            if (ListVerify.isNull(nettyServerConfig.channelHandlerList)){
//                nettyServerConfig.channelHandlerList = new ArrayList<>();
//            }
//            return nettyServerConfig.channelHandlerList;
//        }
    }

}
